/**
 * 下载管理器 - 简化版本，使用模块化架构
 */

import DownloadFactory from './download/DownloadFactory.js'

class DownloadManager {
  
  /**
   * 处理电影下载
   * @param {Object} movie 电影对象
   */
  static handleMovieDownload(movie) {
    return DownloadFactory.handleDownload('movie', movie)
  }
  
  /**
   * 处理游戏下载
   * @param {Object} game 游戏对象
   */
  static handleGameDownload(game) {
    return DownloadFactory.handleDownload('game', game)
  }
  
  /**
   * 处理小说下载
   * @param {Object} novel 小说对象
   */
  static handleNovelDownload(novel) {
    return DownloadFactory.handleDownload('novel', novel)
  }
  
  /**
   * 处理音乐下载
   * @param {Object} music 音乐对象
   */
  static handleMusicDownload(music) {
    return DownloadFactory.handleDownload('music', music)
  }
  
  /**
   * 通用下载处理 - 根据类型自动分发
   * @param {string} type 下载类型
   * @param {Object} item 下载项
   * @param {Object} options 选项
   */
  static handleDownload(type, item, options = {}) {
    return DownloadFactory.handleDownload(type, item, options)
  }
  
  // ========== 断点续传相关方法 ==========
  
  /**
   * 继续下载
   * @param {string} itemName 项目名称
   * @param {string} itemType 项目类型
   */
  static resumeDownload(itemName, itemType) {
    return DownloadFactory.resumeDownload(itemName, itemType)
  }
  
  /**
   * 获取可恢复的下载信息
   * @param {string} itemName 项目名称
   * @param {string} itemType 项目类型
   */
  static getResumableDownload(itemName, itemType) {
    return DownloadFactory.getResumableDownload(itemName, itemType)
  }
  
  /**
   * 清除可恢复的下载信息
   * @param {string} itemName 项目名称
   * @param {string} itemType 项目类型
   */
  static clearResumableDownload(itemName, itemType) {
    return DownloadFactory.clearResumableDownload(itemName, itemType)
  }
  
  /**
   * 获取所有可恢复的下载
   */
  static getAllResumableDownloads() {
    return DownloadFactory.getAllResumableDownloads()
  }
  
  /**
   * 清空所有断点续传信息
   */
  static clearAllResumableDownloads() {
    return DownloadFactory.clearAllResumableDownloads()
  }
  
  // ========== 工具方法 ==========
  
  /**
   * 导航到下载页面
   */
  static navigateToDownloadPage() {
    return DownloadFactory.navigateToDownloadPage()
  }
  
  /**
   * 复制到剪贴板
   * @param {string} text 要复制的文本
   * @param {string} message 成功提示信息
   */
  static copyToClipboard(text, message) {
    return DownloadFactory.copyToClipboard(text, message)
  }
  
  /**
   * 格式化文件大小
   * @param {number} bytes 字节数
   * @returns {string} 格式化后的大小
   */
  static formatFileSize(bytes) {
    return DownloadFactory.formatFileSize(bytes)
  }
  
  /**
   * 获取支持的下载类型
   * @returns {Array} 支持的类型列表
   */
  static getSupportedTypes() {
    return DownloadFactory.getSupportedTypes()
  }
  
  /**
   * 注册新的下载处理器
   * @param {string} type 下载类型
   * @param {Object} handler 下载处理器类
   */
  static registerHandler(type, handler) {
    return DownloadFactory.registerHandler(type, handler)
  }
  
  // ========== 兼容旧版本接口 ==========
  
  /**
   * 获取游戏名称 - 兼容接口
   * @param {Object} game 游戏对象
   * @returns {string} 游戏名称
   */
  static getGameName(game) {
    const GameDownloadHandler = DownloadFactory.getHandler('game')
    return GameDownloadHandler.getItemName(game)
  }
  
  /**
   * 获取电影名称 - 兼容接口
   * @param {Object} movie 电影对象
   * @returns {string} 电影名称
   */
  static getMovieName(movie) {
    const MovieDownloadHandler = DownloadFactory.getHandler('movie')
    return MovieDownloadHandler.getItemName(movie)
  }
  
  /**
   * 获取游戏类型显示 - 兼容接口
   * @param {string} type 游戏类型
   * @returns {string} 游戏类型显示名称
   */
  static getGameTypeDisplay(type) {
    const GameDownloadHandler = DownloadFactory.getHandler('game')
    return GameDownloadHandler.getGameTypeDisplay(type)
  }
  
  /**
   * 获取游戏目录 - 兼容接口
   * @param {string} gameType 游戏类型
   * @returns {string} 目录路径
   */
  static getGameDirectory(gameType) {
    console.loh('游戏类型：{gameType}', gameType)
    const GameDownloadHandler = DownloadFactory.getHandler('game')
    return GameDownloadHandler.getGameDirectory(gameType)
  }
  
  /**
   * 打开游戏目录 - 兼容接口
   * @param {string} gameType 游戏类型
   * @param {string} filePath 文件路径
   * @param {string} specificDirectory 指定目录（可选）
   */
  static openGameDirectory(gameType, filePath, specificDirectory = null) {
    // #ifdef APP-PLUS
    // 如果指定了特定目录，则使用该目录
    const targetDir = specificDirectory || this.getGameDirectory(gameType)
    
    try {
      // 使用现代化的文件访问方式
      this.openDirectoryWithModernAPI(targetDir, filePath, gameType)
    } catch (error) {
      console.log('打开目录异常:', error)
      this.showDirectoryPathInfo(targetDir)
    }
    // #endif
    
    // #ifndef APP-PLUS
    uni.showToast({
      title: '此功能仅在APP中可用',
      icon: 'none'
    })
    // #endif
  }
  
  /**
   * 使用现代API打开目录
   * @param {string} targetDir 目标目录
   * @param {string} filePath 文件路径
   * @param {string} gameType 游戏类型
   */
  static openDirectoryWithModernAPI(targetDir, filePath, gameType) {
    // #ifdef APP-PLUS
    // 获取现代化的文件路径
    plus.io.requestFileSystem(plus.io.PUBLIC_DOCUMENTS, 
      (fs) => {
        // 检查目录是否存在
        fs.root.getDirectory(targetDir, { create: false }, 
          (dirEntry) => {
            console.log('目录存在:', dirEntry.fullPath)
            // 目录存在，尝试打开
            this.tryOpenDirectoryWithIntents(dirEntry.fullPath, filePath, gameType)
          },
          (dirError) => {
            console.log('目录不存在:', targetDir)
            // 目录不存在，显示提示
            uni.showModal({
              title: '目录不存在',
              content: `游戏目录《${targetDir}》不存在。\n\n请先下载一些游戏后再查看目录。`,
              confirmText: '知道了',
              showCancel: false
            })
          }
        )
      },
      (fsError) => {
        console.log('文件系统获取失败:', fsError)
        this.showDirectoryPathInfo(targetDir)
      }
    )
    // #endif
  }
  
  /**
   * 尝试使用Intent打开目录
   * @param {string} fullPath 完整路径
   * @param {string} filePath 文件路径
   * @param {string} gameType 游戏类型
   */
  static tryOpenDirectoryWithIntents(fullPath, filePath, gameType) {
    // #ifdef APP-PLUS
    try {
      const Intent = plus.android.importClass('android.content.Intent')
      const Uri = plus.android.importClass('android.net.Uri')
      const Build = plus.android.importClass('android.os.Build')
      const FileProvider = plus.android.importClass('androidx.core.content.FileProvider')
      const File = plus.android.importClass('java.io.File')
      
      // Android 7.0+ 使用FileProvider
      if (Build.VERSION.SDK_INT >= 24) {
        try {
          // 使用文档选择器打开目录
          const intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
          intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
          
          plus.android.runtimeMainActivity().startActivity(intent)
          
          uni.showToast({
            title: '请在文件选择器中找到游戏目录',
            icon: 'none',
            duration: 4000
          })
          
          return
        } catch (docError) {
          console.log('文档选择器失败:', docError)
        }
      }
      
      // 备选方案：打开文件管理器
      this.tryAlternativeFileManager('', filePath)
      
    } catch (error) {
      console.log('打开目录Intent异常:', error)
      this.tryAlternativeFileManager('', filePath)
    }
    // #endif
  }
  
  /**
   * 尝试其他文件管理器打开方式
   * @param {string} targetDir 目标目录
   * @param {string} filePath 文件路径
   */
  static tryAlternativeFileManager(targetDir, filePath) {
    // #ifdef APP-PLUS
    try {
      // 方法1: 尝试打开ES文件浏览器或其他文件管理器
      const Intent = plus.android.importClass('android.content.Intent')
      const ComponentName = plus.android.importClass('android.content.ComponentName')
      
      const fileManagerApps = [
        // ES文件浏览器
        { pkg: 'com.estrongs.android.pop', cls: 'com.estrongs.android.pop.view.FileExplorerActivity' },
        // 小米文件管理器
        { pkg: 'com.mi.android.globalFileexplorer', cls: 'com.android.fileexplorer.FileExplorerTabActivity' },
        // 华为文件管理器
        { pkg: 'com.huawei.hidisk', cls: 'com.huawei.hidisk.ui.MainActivity' },
        // OPPO文件管理器
        { pkg: 'com.coloros.filemanager', cls: 'com.coloros.filemanager.FileManagerActivity' },
        // vivo文件管理器
        { pkg: 'com.android.filemanager', cls: 'com.android.filemanager.FileManagerActivity' }
      ]
      
      let opened = false
      for (let app of fileManagerApps) {
        try {
          const intent = new Intent()
          intent.setComponent(new ComponentName(app.pkg, app.cls))
          intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
          
          plus.android.runtimeMainActivity().startActivity(intent)
          
          uni.showToast({
            title: '已打开文件管理器，请手动导航到游戏目录',
            icon: 'none',
            duration: 3000
          })
          opened = true
          break
        } catch (e) {
          console.log(`尝试打开${app.pkg}失败:`, e)
        }
      }
      
      if (!opened) {
        // 方法2: 尝试使用通用Intent
        try {
          const intent = new Intent(Intent.ACTION_GET_CONTENT)
          intent.setType('*/*')
          intent.addCategory(Intent.CATEGORY_OPENABLE)
          intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
          
          plus.android.runtimeMainActivity().startActivity(intent)
          uni.showToast({
            title: '已打开文件选择器',
            icon: 'success'
          })
          opened = true
        } catch (genericError) {
          console.log('通用Intent也失败:', genericError)
        }
      }
      
      if (!opened) {
        // 方法3: 尝试打开具体文件
        if (filePath) {
          this.tryOpenSpecificFile(filePath)
        } else {
          this.showDirectoryPathInfo(targetDir)
        }
      }
    } catch (error) {
      console.log('备选方案失败:', error)
      this.showDirectoryPathInfo(targetDir)
    }
    // #endif
  }
  
  /**
   * 尝试打开具体文件
   * @param {string} filePath 文件路径
   */
  static tryOpenSpecificFile(filePath) {
    // #ifdef APP-PLUS
    uni.openDocument({
      filePath: filePath,
      success: () => {
        console.log('打开文件成功')
        uni.showToast({
          title: '已打开游戏文件',
          icon: 'success'
          })
      },
      fail: (err) => {
        console.log('打开文件失败:', err)
        this.showDirectoryPathInfo(filePath.substring(0, filePath.lastIndexOf('/')))
      }
    })
    // #endif
  }
  
  /**
   * 显示目录路径信息（当无法打开目录时）
   * @param {string} targetDir 目标目录
   */
  static showDirectoryPathInfo(targetDir) {
    // 获取现代化的文件路径
    // #ifdef APP-PLUS
    
    // 判断是否为外部存储路径
    const isExternalPath = !targetDir.includes('Android/data')
    
    if (isExternalPath) {
      // 外部存储路径
      const externalPath = `/storage/emulated/0${targetDir}`
      
      uni.showModal({
        title: '文件保存位置',
        content: `游戏已保存到：
${externalPath}

这是外部存储目录，可以通过任何文件管理器访问。

推荐使用ES文件浏览器或其他第三方文件管理器。`,
        confirmText: '复制路径',
        cancelText: '我知道了',
        success: (res) => {
          if (res.confirm) {
            this.copyToClipboard(externalPath, '路径已复制')
          }
        }
      })
    } else {
      // 应用数据目录
      plus.io.requestFileSystem(plus.io.PUBLIC_DOCUMENTS, 
        (fs) => {
          const modernPath = fs.root.fullPath + targetDir
          
          uni.showModal({
            title: '文件保存位置',
            content: `游戏已保存到：
${modernPath}

这是应用专用目录，只能通过特殊文件管理器访问。

建议使用ES文件浏览器或其他第三方文件管理器。`,
            confirmText: '复制路径',
            cancelText: '我知道了',
            success: (res) => {
              if (res.confirm) {
                this.copyToClipboard(modernPath, '路径已复制')
              }
            }
          })
        },
        (error) => {
          // 备选：使用默认路径
          const fallbackPath = `/storage/emulated/0/Android/data/io.dcloud.HBuilder/documents${targetDir}`
          
          uni.showModal({
            title: '文件保存位置',
            content: `游戏已保存到：
${fallbackPath}

请使用文件管理器手动查看。

建议使用ES文件浏览器或其他第三方文件管理器。`,
            confirmText: '复制路径',
            cancelText: '我知道了',
            success: (res) => {
              if (res.confirm) {
                this.copyToClipboard(fallbackPath, '路径已复制')
              }
            }
          })
        }
      )
    }
    // #endif
    
    // #ifndef APP-PLUS
    uni.showToast({
      title: '此功能仅在APP中可用',
      icon: 'none'
    })
    // #endif
  }
}

export default DownloadManager